home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / bmpcut_s / bmpcut_s.lzh / BMPCUT2.S < prev    next >
Text File  |  1997-07-12  |  29KB  |  1,266 lines

  1. *********************************************************************************
  2. *    EVANGELION .DLL BMP CUTTER                <BMPCUT2.X>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9.     .text
  10.  
  11. start:
  12.     move.l    8(a0),d0
  13.     and.l    #$ff_ff_ff_fe,d0
  14.     move.l    d0,sp            *スタック セット
  15.     sub.l    a1,d0            *プログラムの終わりからプロセスの終わりまで
  16.     sub.l    #6000,d0        *スタック サイズ
  17.     move.l    d0,buff_size        *残りは、バッファにする
  18.     move.l    a1,buff_addr        *バッファアドレス セット
  19.  
  20.     bsr    cmdchk            *コマンドラインの解析
  21.     bsr    s_name_chk        *セーブファイル名のチェック
  22.     bsr    name_get        *ファイル名を取得し処理する
  23.     bsr    exit            *終了処理
  24.     DOS    _EXIT
  25.  
  26. *****************************************************************
  27. *    ファイル名を取得し、ファイルの読み込みを行う        *
  28. *****************************************************************
  29. name_get:
  30.     clr.w    file_cnt        *ファイル数のカウント初期化
  31.  
  32.     bsr    chkname            *ファイル名に対する前処理
  33.     bsr    chkext            *拡張子が省略されているかチェック
  34.  
  35.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  36.     pea.l    arg1(pc)        *
  37.     pea.l    filbuf(pc)        *
  38.     DOS    _FILES            *
  39.     lea.l    10(sp),sp        *
  40.  
  41. loop:
  42.     tst.l    d0            *ファイルは見つかったか?
  43.     bmi    done            * 見つからなければ処理完了
  44.  
  45.     bsr    setpath            *得られたファイル名を
  46.                     * フルパスに再構成する
  47.  
  48.     bsr    main            *メイン処理
  49.  
  50.     pea.l    filbuf(pc)        *つぎのファイルを検索する
  51.     DOS    _NFILES            *
  52.     addq.l    #4,sp            *
  53.  
  54.     bra    loop            *繰り返す
  55.  
  56. done:
  57.     bsr    file_cnt_chk        *処理したファイル数のチェック
  58.     rts
  59.  
  60. *****************************************************************
  61. *    files実行に先立ってファイル名に前処理を加える        *
  62. *****************************************************************
  63. chkname:
  64.     pea.l    nambuf(pc)        *ファイル名を展開する
  65.     pea.l    arg1(pc)        *
  66.     DOS    _NAMECK            *
  67.     addq.l    #8,sp            *
  68.  
  69.     tst.l    d0            *d0<0なら
  70.     bmi    in_name_err        * ファイル名の指定に誤りがある
  71.  
  72.     beq    nowild            *d0=0ならワイルドカード指定なし
  73.  
  74.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  75.     bne    wild            * ワイルドカード指定あり
  76.  
  77. noname:                    *ファイル名が指定されていない場合
  78.     lea.l    arg1(pc),a0        *バッファarg1に
  79.     lea.l    nambuf(pc),a1        * nameckで展開したパス名+'*.*'
  80.     bsr    strcpy            * を再構成する
  81.     lea.l    kome0(pc),a1        *
  82.     bsr    strcpy            *
  83.  
  84. wild:                    *ワイルドカードが指定された場合
  85.                     *何もしなくてよい
  86. cknam0:
  87.     rts
  88.  
  89. nowild:                    *ワイルドカードが指定されていない場合
  90.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  91.     pea.l    arg1(pc)        * 検索してみる
  92.     pea.l    filbuf(pc)        *
  93.     DOS    _FILES            *
  94.     lea.l    10(sp),sp        *
  95.     
  96.     tst.l    d0            *見つかったか?
  97.     bmi    cknam0            * 見つからなければファイルだろう
  98.  
  99.     lea.l    arg1(pc),a0        *バッファarg1に
  100.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.PAC'
  101.     bsr    strcat            * を再構成する
  102.  
  103.     bra    chkname            *nameckでファイル名を展開するために
  104.                     * サブルーチン先頭に戻る
  105.  
  106. *****************************************************************
  107. *    出力パス名をチェックする                *
  108. *****************************************************************
  109. s_name_chk:
  110.     lea.l    arg2(pc),a0        *出力パス名を指定したか?
  111.     tst.b    (a0)
  112.     beq    s_name_chk8        *してない
  113.  
  114.     pea.l    nambuf(pc)        *ファイル名を展開する
  115.     pea.l    arg2(pc)        *
  116.     DOS    _NAMECK            *
  117.     addq.l    #8,sp            *
  118.  
  119.     tst.l    d0            *d0<0なら
  120.     bmi    out_name_err        * パス名の指定に誤りがある
  121.  
  122.     beq    s_name_chk1        *d0=0ならワイルドカード指定なし
  123.  
  124.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  125.     bne    out_name_err        * ワイルドカード指定あり
  126.  
  127. s_name_chk1:
  128.     lea.l    arg2(pc),a0        *ドライブ名を指定しているか?
  129.     cmp.b    #':',1(a0)
  130.     bne    out_name_err        *ドライブ名の指定に誤りがある
  131.  
  132.     tst.b    2(a0)            *ドライブ名のみか
  133.     bne    s_name_chk2        *違う
  134.     addq.l    #2,a0
  135.     bra    s_name_chk9
  136.  
  137. s_name_chk2:
  138.     moveq.l    #0,d0            *セーブ先ドライブ番号を求める
  139.     move.b    (a0),d0
  140.     bsr    toupper
  141.     sub.b    #'A',d0
  142.     add.b    #1,d0
  143.  
  144.     lea.l    spathbuf(pc),a1        *セーブ先ドライブ名
  145.     move.b    (a0),(a1)+
  146.     move.b    #':',(a1)+
  147.     move.b    #'\',(a1)+
  148.  
  149.     move.l    a1,-(sp)        *セーブ先パスをセーブ
  150.     move.w    d0,-(sp)
  151.     DOS    _CURDIR
  152.     addq.l    #6,sp
  153.  
  154.     lea.l    cpathbuf(pc),a2        *カレントパスをセーブしておく
  155.     DOS    _CURDRV
  156.     add.b    #"A",d0
  157.     move.b    d0,(a2)+
  158.     move.b    #':',(a2)+
  159.     move.b    #'\',(a2)+
  160.  
  161.     move.l    a2,-(sp)
  162.     move.w    #0,-(sp)
  163.     DOS    _CURDIR
  164.     addq.l    #6,sp
  165.  
  166.     pea.l    arg2(pc)        *コマンドラインで指定されたパスへ
  167.     DOS    _CHDIR            * 移動してみる
  168.     addq.l    #4,sp
  169.  
  170.     tst.l    d0            *d0が0でなければ
  171.     bmi    path_err        * パス名の指定に誤りがある
  172.  
  173.     pea.l    spathbuf(pc)        *セーブ先パスを戻す
  174.     DOS    _CHDIR
  175.     addq.l    #4,sp
  176.  
  177.     pea.l    cpathbuf(pc)        *カレントパスに戻す
  178.     DOS    _CHDIR
  179.     addq.l    #4,sp
  180.  
  181.     lea.l    arg2(pc),a0        *
  182.     bsr    set_en            *パス名の最後に\マークをセット
  183.     bra    s_name_chk9
  184.  
  185. s_name_chk8:
  186.     lea.l    arg2(pc),a0
  187.     DOS    _CURDRV            *カレントドライブ名GET
  188.     add.b    #"A",d0
  189.     move.b    d0,(a0)+
  190.     move.b    #":",(a0)+
  191.     bra    s_name_chk9
  192.  
  193. s_name_chk9:
  194.     move.l    a0,nameichi
  195.     rts
  196.  
  197. *****************************************************************
  198. *    パス名に¥マークを連結する                *
  199. *****************************************************************
  200. set_en:
  201.     tst.b    (a0)+            *(a0)は0か?
  202.     bne    set_en            *そうでなければ繰り返す
  203.     subq.l    #1,a0            *行きすぎたから1つ戻る
  204.  
  205.     cmp.b    #"\",-1(a0)        *一番最後の文字が¥か
  206.     beq    set_en_            * ¥ならばスキップ
  207.     move.b    #'\',(a0)+        * ¥をセット
  208. set_en_:
  209.     rts
  210.  
  211. *****************************************************************
  212. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  213. *        arg1以降に格納する                *
  214. *****************************************************************
  215. setpath:
  216.     lea.l    arg1(pc),a0        *a0=コピー先
  217.     lea.l    nambuf(pc),a1        *a1=nameckで展開したパス名
  218.     bsr    strcpy            *コピーする
  219.     lea.l    filbuf(pc),a1        *a1=files,nfilesで見付けたファイル名
  220.     lea.l    30(a1),a1
  221.     bsr    strcpy            *連結する
  222.     rts
  223.  
  224. *****************************************************************
  225. *    文字列の連結および複写                    *
  226. *    リターン時a0は文字列末の00Hを指す            *
  227. *****************************************************************
  228. strcat:
  229.     tst.b    (a0)+            *(a0)は0か?
  230.     bne    strcat            *そうでなければ繰り返す
  231.     subq.l    #1,a0            *行きすぎたから1つ戻る
  232. strcpy:
  233.     move.b    (a1)+,(a0)+        *1文字ずつ
  234.     bne    strcpy            *終了コードまでを転送する
  235.     subq.l    #1,a0            *a0は進み過ぎている
  236.                     *a0は文字列末の00Hを指す
  237.     rts
  238.  
  239. *****************************************************************
  240. *    拡張子を補う                        *
  241. *****************************************************************
  242. chkext:
  243.     lea.l    arg1(pc),a0        *ファイル名のアドレス
  244.     lea.l    dext(pc),a1        *拡張子のアドレス
  245. chkext0:
  246.     cmp.b    #".",(a0)        *拡張子があるか
  247.     beq    chkext2
  248.     tst.b    (a0)+            *(a0)は0か?
  249.     bne    chkext0            *そうでなければ繰り返す
  250.     subq.l    #1,a0            *行きすぎたから1つ戻る
  251. chkext1:
  252.     move.b    (a1)+,(a0)+        *1文字転送
  253.     bne    chkext1            *終了コードまで繰り返す
  254. chkext2:
  255.     rts
  256.  
  257. *****************************************************************
  258. *    コマンドラインのチェックを行う                *
  259. *****************************************************************
  260. cmdchk:
  261.     lea.l    arg1(pc),a0        *a0=引数切り出し領域
  262.     clr.b    256(a0)            *出力ファイル名をちょっと初期化
  263.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  264.  
  265. cmdchk0:
  266.     bsr    switch_chk        *スイッチのチェック
  267.  
  268.     tst.b    (a2)            *引数があるか?
  269.     beq    usage            *ないならファイル名が足りない
  270.     bsr    getarg            *ファイル名切り出し
  271.     lea.l    256(a0),a0        *a0=a0+256
  272.     bsr    switch_chk        *さらにスイッチのチェック
  273.     bsr    getarg            *ファイル名切り出し
  274.     bsr    switch_chk        *さらにスイッチのチェック
  275.     tst.b    (a2)            *引数があるか?
  276.     bne    usage            * あるなら引数が多い
  277. cmdchk1:
  278.     rts
  279.  
  280. *****************************************************************
  281. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  282. *    スイッチがあれば処理してしまう                *
  283. *****************************************************************
  284. switch_chk:
  285.     bsr    skipsp            *スペースをスキップする
  286.     tst.b    (a2)            *まだスイッチがあるか?
  287.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  288.  
  289.     cmpi.b    #'/',(a2)        *引数の先頭が
  290.     beq    switch_chk1        */,-であれば
  291.     cmpi.b    #'-',(a2)        *  スイッチ
  292.     beq    switch_chk1        *
  293.     bra    switch_chk2        *スイッチでないなら戻る
  294.  
  295. switch_chk1:
  296.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  297.     tst.b    (a2)            *スイッチがあるか?
  298.     beq    usage            * ないなら使用方表示
  299.     move.b    (a2)+,d0        *1文字取り出す
  300.     bsr    toupper            *大文字に変換しておく
  301.     bra    usage            *無効なスイッチが指定された
  302.  
  303. switch_chk2:
  304.     rts
  305.  
  306. *****************************************************************
  307. *    ファイル名を切り出す                    *
  308. *****************************************************************
  309. getarg:
  310.     move.l    a0,-(sp)        *{レジスタ待避
  311. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  312.     beq    gtarg1            *
  313.     cmpi.b    #SPACE,(a2)        *2)スペースか
  314.     beq    gtarg1            *
  315.     cmpi.b    #TAB,(a2)        *3)タブか
  316.     beq    gtarg1            *
  317. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  318. *    beq    gtarg1            *
  319.     cmpi.b    #'/',(a2)        *5)スラッシュ
  320.     beq    gtarg1            *
  321.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  322.     bra    gtarg0            * 繰り返す
  323. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  324.     movea.l    (sp)+,a0        *}レジスタ復帰
  325.     rts
  326.  
  327. *****************************************************************
  328. *    スペース・TABをスキップする                *
  329. *****************************************************************
  330. skipsp0:
  331.     addq.l    #1,a2
  332. skipsp:
  333.     cmpi.b    #$20,(a2)
  334.     beq    skipsp0
  335.     cmpi.b    #$09,(a2)
  336.     beq    skipsp0
  337.     rts
  338.  
  339. *****************************************************************
  340. *    小文字→大文字変換ルーチン                *
  341. *****************************************************************
  342. toupper:
  343.     cmpi.b    #'a',d0
  344.     bcs    toupr0
  345.     cmpi.b    #'z'+1,d0
  346.     bcc    toupr0
  347.     subi.b    #$20,d0
  348. toupr0:
  349.     rts
  350.  
  351. *****************************************************************
  352. *    メイン処理                        *
  353. *****************************************************************
  354. main:
  355.     clr.w    edaban
  356.     bsr    save_name_get
  357.     lea.l    arg1(pc),a0        *ファイル名セット
  358.     bsr    file_open        *ファイルオープン
  359.     bsr    file_size        *ファイルサイズを調べる
  360.     move.l    d6,filesize
  361.  
  362.     cmp.l    buff_size(pc),d6
  363.     bhi    small            *一括ロード分のメモリが無い
  364.  
  365.     bsr    yomikomi_prt
  366.     movea.l    buff_addr(pc),a6
  367.     bsr    file_read        *ファイル読む
  368.     bsr    file_close        *ファイルクローズ
  369.  
  370.     movea.l    a6,a1
  371.     movea.l    a6,a2
  372.     adda.l    d6,a2
  373.     movea.l    a1,a3
  374.  
  375. main0:
  376.     bsr    kensaku_prt
  377.     movea.l    a1,a4
  378. main0_:
  379.     cmp.l    a1,a4
  380.     bne    main1
  381.     bsr    ichi_prt
  382.     lea.l    1024(a4),a4
  383.  
  384. main1:
  385.     cmp.l    a1,a2
  386.     bls    main9
  387.  
  388.     cmp.b    #$28,(a1)+
  389.     bne    main0_
  390.     cmp.b    #$00,(a1)
  391.     bne    main0_
  392.  
  393.     move.b    12(a1),d0        *Plane Check
  394.     lsl.w    #8,d0
  395.     move.b    11(a1),d0
  396.     cmp.w    #$01,d0
  397.     bne    main0_
  398.  
  399.     move.b    14(a1),d3        *BitCount Check
  400.     lsl.w    #8,d3
  401.     move.b    13(a1),d3
  402.     cmp.w    #1,d3
  403.     beq    main2
  404.     cmp.w    #4,d3
  405.     beq    main2
  406.     cmp.w    #8,d3
  407.     beq    main2
  408.     cmp.w    #24,d3
  409.     bne    main0_
  410.  
  411. main2:
  412.     subq.l    #1,a1
  413.     bsr    hakken_prt
  414.     bsr    ichi_prt
  415.  
  416.     move.b    7(a1),d0        *BMP X SIZE
  417.     lsl.w    #8,d0
  418.     move.b    6(a1),d0
  419.     swap    d0
  420.     move.b    5(a1),d0
  421.     lsl.w    #8,d0
  422.     move.b    4(a1),d0
  423.  
  424.     move.b    11(a1),d1        *BMP Y SIZE
  425.     lsl.w    #8,d1
  426.     move.b    10(a1),d1
  427.     swap    d1
  428.     move.b    9(a1),d1
  429.     lsl.w    #8,d1
  430.     move.b    8(a1),d1
  431.  
  432.     move.b    35(a1),d2        *Clr Used
  433.     lsl.w    #8,d2
  434.     move.b    34(a1),d2
  435.     swap    d2
  436.     move.b    33(a1),d2
  437.     lsl.w    #8,d2
  438.     move.b    32(a1),d2
  439.  
  440.     bsr    line_byte_get
  441.     bsr    bmp_head_set
  442.     move.l    d0,bmpsize
  443.  
  444.     movea.l    a1,a6            *セーブアドレス
  445.     bsr    bmp_save
  446.     add.l    bmpsize(pc),a1
  447.     sub.l    #14,a1            *補間したデータ分引く
  448.  
  449.     addq.w    #1,file_cnt        *ファイル数のカウント+1
  450.     bra    main0
  451.  
  452. main9:
  453.     bsr    kensaku2_prt
  454.     bsr    ichi_prt
  455.     lea.l    crlf_mes(pc),a0
  456.     bsr    mesput
  457.     rts
  458.  
  459. *****************************************************************
  460. *    省メモリルーチン ちまちまロード            *
  461. *****************************************************************
  462. small:
  463.     move.l    d6,d5
  464.     bsr    yomikomi_prt
  465.  
  466. small0:    
  467.     bsr    kensaku_prt
  468.     movea.l    d5,a4
  469.  
  470. small1:
  471.     cmp.l    d5,a4
  472.     bcs    small2
  473.     bsr    ichi_prt1
  474.     lea.l    -1024(a4),a4
  475.     cmp.l    #1024,d5
  476.     bhi    small2
  477.     clr.l    a4
  478.  
  479. small2:
  480.     subq.l    #1,d5        *識別子チェック
  481.     bls    small9
  482.     bsr    getc
  483. small3:
  484.     cmp.b    #$28,d0
  485.     bne    small1
  486.  
  487.     subq.l    #1,d5
  488.     bls    small9
  489.     bsr    getc
  490.  
  491.     cmp.b    #$00,d0
  492.     bne    small3
  493.  
  494.     cmp.l    #54-2,d5
  495.     bls    small9
  496.  
  497.     movea.l    buff_addr(pc),a6    *ヘッダの一部を読み込む
  498.     addq.l    #2,a6
  499.     move.l    #40-2,d6        *'2800'を除いた分
  500.     bsr    file_read
  501.     subq.l    #2,a6
  502.  
  503.     move.w    12(a6),d0        *Plane Check
  504.     ror.w    #8,d0
  505.     cmp.w    #1,d0
  506.     bne    small4
  507.  
  508.     move.w    14(a6),d3        *BitCount Check
  509.     ror.w    #8,d3
  510.     cmp.w    #1,d3
  511.     beq    small5
  512.     cmp.w    #4,d3
  513.     beq    small5
  514.     cmp.w    #8,d3
  515.     beq    small5
  516.     cmp.w    #24,d3
  517.     beq    small5
  518.  
  519. small4:
  520.     move.w    #1,-(sp)        *ちがったので
  521.     move.l    #-40+2,-(sp)        *位置を戻す
  522.     move.w    d7,-(sp)
  523.     DOS    _SEEK
  524.     addq.l    #8,sp
  525.     bra    small1
  526.  
  527. small5:
  528.     addq.l    #2,d5
  529.     bsr    hakken_prt
  530.     bsr    ichi_prt1
  531.  
  532.     move.l    32(a6),d0        *ClrUsed
  533.     bsr    i_to_m
  534.     move.l    d0,d2
  535.     move.l    8(a6),d0        *BMP Y SIZE
  536.     bsr    i_to_m
  537.     move.l    d0,d1
  538.     move.l    4(a6),d0        *BMP X SIZE
  539.     bsr    i_to_m
  540.  
  541.     bsr    line_byte_get
  542.     bsr    bmp_head_set
  543.     move.l    d0,bmpsize
  544.     sub.l    #14,d0            *補間したデータ分引く
  545.     sub.l    d0,d5
  546.  
  547.     cmp.l    buff_size(pc),d0
  548.     bhi    no_buff            *メモリが無い
  549.  
  550.     lea.l    40(a6),a6        *残りを読み込む
  551.     move.l    d0,d6
  552.     sub.l    #40,d6
  553.     bsr    file_read
  554.     lea.l    -40(a6),a6
  555.  
  556.     move.b    #$28,(a6)
  557.     move.b    #$00,1(a6)
  558.     move.l    d7,d1            *ファイルハンドルを取っておく
  559.     bsr    bmp_save
  560.     move.l    d1,d7
  561.  
  562.     addq.w    #1,file_cnt        *ファイル数のカウント+1
  563.     bra    small0
  564.  
  565. small9:
  566.     bsr    file_close        *ファイルクローズ
  567.     bsr    kensaku2_prt
  568.     moveq.l    #0,d5
  569.     bsr    ichi_prt1
  570.     lea.l    crlf_mes(pc),a0
  571.     bsr    mesput
  572.     rts
  573.  
  574. i_to_m:
  575.     ror.w    #8,d0
  576.     swap.w    d0
  577.     ror.w    #8,d0
  578.     rts
  579.  
  580. *****************************************************************
  581. *    1ラインのバイト数を求める                *
  582. *****************************************************************
  583. line_byte_get:
  584.     cmp.w    #4,d3
  585.     bcs    lb_set1
  586.     beq    lb_set4
  587.     cmp.w    #8,d3
  588.     beq    lb_set8
  589.     bhi    lb_set24
  590.  
  591. lb_set1:
  592.     addq.w    #7,d0
  593.     lsr.w    #3,d0
  594.     addq.w    #3,d0
  595.     and.w    #$fffc,d0
  596.     bra    line_byte_set9
  597.  
  598. lb_set4:
  599.     addq.w    #1,d0
  600.     lsr.w    #1,d0
  601.     addq.w    #3,d0
  602.     and.w    #$fffc,d0
  603.     bra    line_byte_set9
  604.  
  605. lb_set8:
  606.     addq.w    #3,d0
  607.     andi.w    #$fffc,d0
  608.     bra    line_byte_set9
  609.  
  610. lb_set24:
  611.     move.w    d0,d4
  612.     add.w    d4,d4
  613.     add.w    d4,d0
  614.     addq.w    #3,d0
  615.     and.w    #$fffc,d0
  616.  
  617. line_byte_set9:
  618.     rts
  619.  
  620. *****************************************************************
  621. *    ヘッダ情報作成                        *
  622. *****************************************************************
  623. bmp_head_set:
  624.     lea.l    bmp_head(pc),a0
  625.  
  626.     mulu.w    d1,d0            *line_byte * tate
  627.     add.l    d2,d2            *ClrUsed * 4
  628.     add.l    d2,d2
  629.  
  630.     tst.l    d2            *色数情報なし
  631.     beq    bh_set0
  632.  
  633.     add.l    #54,d2
  634.     add.l    d2,d0
  635.  
  636.     ror.w    #8,d2
  637.     swap.w    d2
  638.     ror.w    #8,d2
  639.     move.l    d2,$a(a0)
  640.     bra    bmp_head_set9
  641.  
  642. bh_set0:
  643.     cmp.w    #4,d3
  644.     bcs    bh_set1
  645.     beq    bh_set4
  646.     cmp.w    #8,d3
  647.     beq    bh_set8
  648.     bhi    bh_set24
  649.  
  650. bh_set1:
  651.     move.l    #$3e000000,$a(a0)
  652.     add.l    #62,d0
  653.     bra    bmp_head_set9
  654.  
  655. bh_set4:
  656.     move.l    #$76000000,$a(a0)
  657.     add.l    #118,d0
  658.     bra    bmp_head_set9
  659.  
  660. bh_set8:
  661.     move.l    #$36040000,$a(a0)
  662.     add.l    #1078,d0
  663.     bra    bmp_head_set9
  664.  
  665. bh_set24:
  666.     move.l    #$36000000,$a(a0)
  667.     add.l    #54,d0
  668.  
  669. bmp_head_set9:
  670.     bsr    i_to_m
  671.     move.l    d0,2(a0)
  672.     bsr    i_to_m
  673.     rts
  674.  
  675. *****************************************************************
  676. *    検索位置を表示する                    *
  677. *****************************************************************
  678. ichi_prt:
  679.     IOCS    _B_UP_S
  680.     moveq.l    #10,d1
  681.     IOCS    _B_RIGHT
  682.     move.l    a1,d0
  683.     sub.l    a3,d0
  684.     bra    ichi_prt2
  685.  
  686. ichi_prt1:
  687.     IOCS    _B_UP_S
  688.     moveq.l    #10,d1
  689.     IOCS    _B_RIGHT
  690.     move.l    filesize(pc),d0
  691.     sub.l    d5,d0
  692.  
  693. ichi_prt2:
  694.     lea.l    dec_buf(pc),a0
  695.     bsr    bin2dec
  696.     bsr    zero_keshi
  697.     lea.l    dec_buf(pc),a0
  698.     bsr    mesput
  699.  
  700.     lea.l    sla_mes(pc),a0
  701.     bsr    mesput
  702.  
  703.     move.l    filesize(pc),d0
  704.     lea.l    dec_buf(pc),a0
  705.     bsr    bin2dec
  706.     bsr    zero_keshi
  707. *    lea.l    dec_buf(pc),a0
  708.     bsr    mesput
  709.  
  710.     lea.l    crlf_mes(pc),a0
  711.     bsr    mesput
  712.  
  713.     rts
  714.  
  715. *****************************************************************
  716. *    セーブするファイル名を作る                *
  717. *****************************************************************
  718. save_name_get:
  719.     movea.l    nameichi(pc),a0
  720.     lea.l    filbuf(pc),a1
  721.     lea.l    30(a1),a1
  722.     bsr    strcpy
  723.  
  724.     movea.l    nameichi(pc),a0
  725.     moveq.l    #15-1,d0
  726. sn_get0:
  727.     cmp.b    #".",(a0)+
  728.     beq    sn_get1
  729.     dbra.w    d0,sn_get0
  730.     addq.l    #1,a0
  731. sn_get1:
  732.     addq.l    #2,a0
  733.     move.l    a0,edaichi
  734.     move.b    #"0",-3(a0)
  735.     move.b    #"0",-2(a0)
  736.     move.b    #"0",-1(a0)
  737.     move.b    #".",(a0)
  738.     move.b    #"B",1(a0)
  739.     move.b    #"M",2(a0)
  740.     move.b    #"P",3(a0)
  741.     move.b    #0,4(a0)
  742.     rts
  743.  
  744. *****************************************************************
  745. *    ディスクに書き込む                    *
  746. *****************************************************************
  747. bmp_save:
  748.     bsr    setdec            *ファイル名作成
  749.  
  750.     move.l    bmpsize(pc),d6        *セーブサイズ
  751.     move.l    d6,d0
  752.     lea.l    dec_buf(pc),a0
  753.     bsr    bin2dec            *ファイルサイズを10進に変換
  754.     bsr    zero_keshi
  755.     bsr    name_prt
  756.  
  757.     bsr    conv_prt        *'セーブ中'を表示
  758.     lea.l    arg2(pc),a0
  759.     bsr    create            *ファイル作成
  760.  
  761.     movem.l    d6/a6,-(sp)
  762.     lea.l    bmp_head(pc),a6
  763.     moveq.l    #14,d6
  764.     bsr    write
  765.     movem.l    (sp)+,d6/a6
  766.     sub.l    #14,d6
  767.  
  768.     bsr    write            *画像データの書き込み
  769.     bsr    file_close        *ファイルクローズ
  770.     bsr    ok_prt            *'OK!'を表示
  771.     rts
  772.  
  773. *****************************************************************
  774. *    ファイル名の枝番をセットする                *
  775. *****************************************************************
  776. setdec:
  777.     add.w    #1,edaban
  778.     move.w    edaban(pc),d0        *枝番を転送
  779.     andi.l    #$0000FFFF,d0        *上位ワードをクリア
  780.     movea.l    edaichi,a0        *転送位置
  781.  
  782. setdec0:
  783.     divu.w    #10,d0            *d0.lを10で割る
  784.     swap.w    d0            *上位ワードと下位ワードを交換
  785.     addi.w    #'0',d0            *0~9 → '0'~'9'
  786.     move.b    d0,-(a0)        *1桁格納
  787.     clr.w    d0            *次の除算に備える
  788.     swap.w    d0            *上位ワードと下位ワードを交換
  789.     bne    setdec0
  790.     rts
  791.  
  792. *****************************************************************
  793. *    2進=>10進                        *
  794. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  795. *****************************************************************
  796. bin2dec:
  797.     PUSH    d0-d3/a0-a1
  798.     moveq.l    #10-1,d1
  799.     lea.l    exp_tbl(pc),a1
  800. bin2dec0:
  801.     clr.b    d2
  802.     move.l    (a1)+,d3
  803. bin2dec1:
  804.     or    d3,d3
  805.     sub.l    d3,d0
  806.     bcs    bin2dec2
  807.     addq.b    #1,d2
  808.     bra    bin2dec1
  809. bin2dec2:
  810.     add.l    d3,d0
  811.     add.b    #'0',d2
  812.     move.b    d2,(a0)+
  813.     dbra    d1,bin2dec0
  814.     POP    d0-d3/a0-a1
  815.     rts
  816.  
  817. exp_tbl:
  818.     .dc.l    1000000000
  819.     .dc.l    100000000
  820.     .dc.l    10000000
  821.     .dc.l    1000000
  822.     .dc.l    100000
  823.     .dc.l    10000
  824.     .dc.l    1000
  825.     .dc.l    100
  826.     .dc.l    10
  827.     .dc.l    1
  828.  
  829. *****************************************************************
  830. *    ファイルサイズの頭にある'0'を消す            *
  831. *****************************************************************
  832. zero_keshi:
  833.     lea.l    dec_buf(pc),a0
  834.     moveq.l    #9-1,d0
  835. zero_keshi0:
  836.     cmp.b    #'0',(a0)
  837.     bne    zero_keshi9
  838.     move.b    #' ',(a0)+
  839.     dbra.w    d0,zero_keshi0
  840. zero_keshi9:
  841.     rts
  842.  
  843. *****************************************************************
  844. *    ファイルのOPENを行う                *
  845. *****************************************************************
  846. file_open:
  847.     move.w    #0,-(sp)        *ファイルopen
  848.     move.l    a0,-(sp)
  849.     DOS    _OPEN
  850.     addq.l    #6,sp
  851.     tst.l    d0            *OK?
  852.     bmi    open_err
  853.     move.l    d0,d7            *ファイルハンドルセーブ
  854.     rts
  855.  
  856. *****************************************************************
  857. *    ファイルのサイズを求める(d6に返す)            *
  858. *****************************************************************
  859. file_size:
  860.     move.w    #2,-(sp)
  861.     move.l    #0,-(sp)
  862.     move.w    d7,-(sp)
  863.     DOS    _SEEK
  864.     addq.l    #8,sp
  865.     tst.l    d0            *OK?
  866.     bmi    read_err
  867.  
  868.     move.l    d0,d6
  869.  
  870.     move.w    #0,-(sp)
  871.     move.l    #0,-(sp)
  872.     move.w    d7,-(sp)
  873.     DOS    _SEEK
  874.     addq.l    #8,sp
  875.     tst.l    d0            *OK?
  876.     bmi    read_err
  877.     rts
  878.  
  879. *****************************************************************
  880. *    ディスクから1文字読み出しを行う            *
  881. *****************************************************************
  882. getc:
  883.     move.w    d7,-(sp)
  884.     DOS    _FGETC            *$FF1B
  885.     addq.l    #2,sp
  886.     tst.l    d0
  887.     bmi    read_err
  888.     rts
  889.  
  890. *****************************************************************
  891. *    ディスクからデータの読み込みを行う            *
  892. *****************************************************************
  893. file_read:
  894.     move.l    d6,-(sp)        *データサイズ
  895.     move.l    a6,-(sp)        *バッファアドレス
  896.     move.w    d7,-(sp)        *ファイルハンドル
  897.     DOS    _READ
  898.     lea    10(sp),sp        *スタック補正
  899.     tst.l    d0            *OK?
  900.     bmi    read_err
  901.     cmp.l    d6,d0            *全部読めたか
  902.     bne    read_err
  903.     rts
  904.  
  905. *****************************************************************
  906. *    ファイル作成                        *
  907. *****************************************************************
  908. create:
  909.     move.w    #$20,-(sp)        *ファイルCREATE
  910.     move.l    a0,-(sp)
  911.     DOS    _CREATE
  912.     addq.l    #6,sp
  913.  
  914.     tst.l    d0        *OK?
  915.     bmi    create_err
  916.     move.l    d0,d7            *ファイルハンドルセーブ
  917.     rts
  918.  
  919. *****************************************************************
  920. *    ディスクに書き込む                    *
  921. *****************************************************************
  922. write:
  923.     move.l    d6,-(sp)        *データサイズ
  924.     move.l    a6,-(sp)        *バッファアドレス
  925.     move.w    d7,-(sp)        *ファイルハンドル
  926.     DOS    _WRITE
  927.     lea.l    10(sp),sp        *スタック補正
  928.     tst.l    d0            *OK?
  929.     bmi    write_err
  930.     cmp.l    d6,d0            *全部書き込めたか?
  931.     bne    write_err
  932.     rts
  933.  
  934. *****************************************************************
  935. *    ファイルをCLOSEする                *
  936. *****************************************************************
  937. file_close:
  938.     move.w    d7,-(sp)        *ファイルCLOSE
  939.     DOS    _CLOSE
  940.     addq.l    #2,sp
  941.     rts
  942.  
  943. *****************************************************************
  944. *    処理したファイル数をチェックする            *
  945. *****************************************************************
  946. file_cnt_chk:
  947.     moveq.l    #0,d0
  948.     move.w    file_cnt(pc),d0
  949.     beq    file_cnt_chk1
  950.  
  951.     lea.l    dec_buf(pc),a0        *あり
  952.     bsr    bin2dec
  953.     bsr    zero_keshi
  954.     bsr    mesput
  955.     lea.l    some_files_mes(pc),a0
  956.     bsr    mesput
  957.     bra    file_cnt_chk9
  958.  
  959. file_cnt_chk1:
  960.     lea.l    no_file_mes(pc),a0    *なし
  961.     bsr    mesput
  962.  
  963. file_cnt_chk9:
  964.     rts
  965.  
  966. *****************************************************************
  967. *    '読み込み中'を表示                    *
  968. *****************************************************************
  969. yomikomi_prt:
  970.     lea.l    filbuf(pc),a0
  971.     lea.l    30(a0),a0
  972.     bsr    mesput
  973.     lea.l    yomikomi_mes(pc),a0
  974.     bsr    mesput
  975.     rts
  976.  
  977. *****************************************************************
  978. *    '検索中'を表示                        *
  979. *****************************************************************
  980. kensaku_prt:
  981.     lea.l    kensaku_mes(pc),a0
  982.     bsr    mesput
  983.     rts
  984.  
  985. *****************************************************************
  986. *    '発見!'を表示                        *
  987. *****************************************************************
  988. hakken_prt:
  989.     IOCS    _B_UP_S
  990.     lea.l    hakken_mes(pc),a0
  991.     bsr    mesput
  992.     rts
  993.  
  994. *****************************************************************
  995. *    '検索終了'を表示                    *
  996. *****************************************************************
  997. kensaku2_prt:
  998.     IOCS    _B_UP_S
  999.     lea.l    kensaku2_mes(pc),a0
  1000.     bsr    mesput
  1001.     rts
  1002.  
  1003. *****************************************************************
  1004. *    'セーブ中'を表示                    *
  1005. *****************************************************************
  1006. conv_prt:
  1007.     lea.l    conv_mes(pc),a0
  1008.     bsr    mesput
  1009.     rts
  1010.  
  1011. *****************************************************************
  1012. *    'OK!'を表示                        *
  1013. *****************************************************************
  1014. ok_prt:
  1015.     lea.l    ok_mes(pc),a0
  1016.     bsr    mesput
  1017.     rts
  1018.  
  1019. *****************************************************************
  1020. *    セーブファイル名&サイズを表示する            *
  1021. *****************************************************************
  1022. name_prt:
  1023.     lea.l    arg2(pc),a0
  1024.     bsr    mesput
  1025.     lea.l    dec_buf(pc),a0
  1026.     bsr    mesput
  1027.     lea.l    byte_mes(pc),a0
  1028.     bsr    mesput
  1029.     rts
  1030.  
  1031. *****************************************************************
  1032. *    入力ファイル名エラー                    *
  1033. *****************************************************************
  1034. in_name_err:
  1035.     lea.l    in_mes(pc),a0
  1036.     bsr    mesput
  1037.     lea.l    name_er_mes(pc),a0
  1038.     bsr    mesput
  1039.     bra    exit2
  1040.  
  1041. *****************************************************************
  1042. *    出力パス名エラー                    *
  1043. *****************************************************************
  1044. out_name_err:
  1045.     lea.l    out_mes(pc),a0
  1046.     bsr    mesput
  1047.     lea.l    name_er_mes(pc),a0
  1048.     bsr    mesput
  1049.     bra    exit2
  1050.  
  1051. *****************************************************************
  1052. *    出力先パスが見付からない                *
  1053. *****************************************************************
  1054. path_err:
  1055.     lea.l    out_mes(pc),a0
  1056.     bsr    mesput
  1057.     lea.l    name_er_mes(pc),a0
  1058.     bsr    mesput
  1059.     bra    exit2
  1060.  
  1061. *****************************************************************
  1062. *    メモリが足りない                    *
  1063. *****************************************************************
  1064. no_buff:
  1065.     bsr    file_close
  1066.     lea.l    no_buff_mes(pc),a0
  1067.     bsr    mesput
  1068.     bra    exit2
  1069.  
  1070. *****************************************************************
  1071. *    ファイルが見付からない                    *
  1072. *****************************************************************
  1073. open_err:
  1074.     lea.l    arg1(pc),a0
  1075.     bsr    mesput
  1076.     lea.l    open_er_mes(pc),a0
  1077.     bsr    mesput
  1078.     bra    exit2
  1079.  
  1080. *****************************************************************
  1081. *    ファイル作成エラー                    *
  1082. *****************************************************************
  1083. create_err:
  1084.     lea.l    arg2(pc),a0
  1085.     bsr    mesput
  1086.     lea.l    create_er_mes(pc),a0
  1087.     bsr    mesput
  1088.     bra    exit2
  1089.  
  1090. *****************************************************************
  1091. *    ファイル書き込みエラー                    *
  1092. *****************************************************************
  1093. write_err:
  1094.     lea.l    arg2(pc),a0
  1095.     bsr    mesput
  1096.     lea.l    write_er_mes(pc),a0
  1097.     bsr    mesput
  1098.     bra    exit2
  1099.  
  1100. *****************************************************************
  1101. *    読み込みエラー                        *
  1102. *****************************************************************
  1103. read_err:
  1104.     lea.l    arg1(pc),a0
  1105.     bsr    mesput
  1106.     lea.l    read_er_mes(pc),a0
  1107.     bsr    mesput
  1108.     bra    exit2
  1109.  
  1110. *****************************************************************
  1111. *    ディスクの空き容量が足りないエラー            *
  1112. *****************************************************************
  1113. no_free_err:
  1114.     lea.l    no_free_mes(pc),a0
  1115.     bsr    mesput
  1116.     bra    exit2
  1117.  
  1118. *****************************************************************
  1119. *    使用方表示                        *
  1120. *****************************************************************
  1121. usage:
  1122.     lea.l    usage_mes(pc),a0
  1123.     bsr    mesput
  1124.     bra    exit2
  1125.  
  1126. *****************************************************************
  1127. *    メッセージ表示                        *
  1128. *****************************************************************
  1129. mesput:
  1130. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  1131.     move.w    #STDOUT,-(sp)        *標準出力へ
  1132.     move.l    a0,-(sp)        *メッセージを
  1133.     DOS    _FPUTS            *出力する
  1134.     addq.l    #6,sp            *スタック補正
  1135.     rts
  1136.  
  1137. *****************************************************************
  1138. *    終了処理                        *
  1139. *****************************************************************
  1140. exit:
  1141.     IOCS    _OS_CURON        *カーソル表示
  1142.  
  1143.     move.w    #-1,-(sp)        *キーバッファクリア
  1144.     DOS    _KFLUSH
  1145.     addq.l    #2,sp
  1146.     rts
  1147.  
  1148. *****************************************************************
  1149. *    エラー処理2                        *
  1150. *****************************************************************
  1151. exit2:
  1152.     bsr    exit
  1153.     move.w    #1,-(sp)        *終了コード1を持って
  1154.     DOS    _EXIT2            * エラー終了
  1155.  
  1156. *****************************************************************
  1157. *    データエリア                        *
  1158. *****************************************************************
  1159.     .data
  1160.     .even
  1161. usage_mes:
  1162.     .dc.b    'BMP FILE CUTTER2 V0.01 by A.MUKAWA',CR,LF
  1163.     .dc.b    '機能:ファイル中に含まれているBMPと思うファイルを切り出します。',CR,LF
  1164.     .dc.b    '用法:BMPCUT2 ファイル名 [出力先パス名]',CR,LF
  1165.     .dc.b    CR,LF
  1166.     .dc.b    '切り出される画像のファイル名は、元のファイル名(最大15文字)の',CR,LF
  1167.     .dc.b    '後ろに3桁の数字が付き、拡張子が"BMP"のファイル名になります。',CR,LF
  1168.     .dc.b    'このファイル名は8文字を超える事が多いので、注意して下さい。',CR,LF
  1169.     .dc.b    0
  1170.  
  1171.  
  1172. some_files_mes:
  1173.     .dc.b    '個のBMPファイルを切り出せました。',CR,LF,0
  1174. no_file_mes:
  1175.     .dc.b    'BMPファイルは見つかりませんでした。',CR,LF,0
  1176. in_mes:
  1177.     .dc.b    '入力ファイル',0
  1178. out_mes:
  1179.     .dc.b    '出力先パス',0
  1180. name_er_mes:
  1181.     .dc.b    '名の指定に間違いがあります!',CR,LF,0
  1182. open_er_mes:
  1183.     .dc.b    ' が見つかりません!',CR,LF,0
  1184. read_er_mes:
  1185.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  1186. create_er_mes:
  1187.     .dc.b    ' が作れません!',CR,LF,0
  1188. write_er_mes:
  1189.     .dc.b    ' の書き込みエラーが発生しました!',CR,LF,0
  1190. no_buff_mes:
  1191.     .dc.b    '変換に必要なメモリがありません!',CR,LF,0
  1192. no_free_mes:
  1193.     .dc.b    'セーブ先の空き容量が足りません!',CR,LF,0
  1194. yomikomi_mes:
  1195.     .dc.b    ' を読み込み中です。',CR,LF,CR,LF,0
  1196. hakken_mes:
  1197.     .dc.b    '発見!',CR,LF,0
  1198. kensaku_mes:
  1199.     .dc.b    '検索中',CR,LF,0
  1200. kensaku2_mes:
  1201.     .dc.b    '検索終了',CR,LF,0
  1202. sla_mes:
  1203.     .dc.b    '/',0
  1204. byte_mes:
  1205.     .dc.b    'byte ',0
  1206. conv_mes:
  1207.     .dc.b    '《セーブ中》 ',,0
  1208. ok_mes:
  1209.     .dc.b    'OK!',CR,LF,CR,LF,0
  1210. crlf_mes:
  1211.     .dc.b    CR,LF,0
  1212.  
  1213. dext:
  1214.     .dc.b    '.*',0            *補う拡張子
  1215. komekome:
  1216.     .dc.b    '\'
  1217. kome0:
  1218.     .dc.b    '*.*',0
  1219.     .even
  1220. bmp_head:
  1221.     .dc.b    'BM'
  1222.     .ds.b    12
  1223. ico_head:
  1224.     .dc.w    $0000,$0100,$0100,$2020,$1000,$0000,$0000,$e802
  1225.     .dc.w    $0000,$1600,$0000
  1226.  
  1227. *****************************************************************
  1228. *    ワークエリア                        *
  1229. *****************************************************************
  1230.     .bss
  1231.     .even
  1232. filbuf:
  1233.     .ds.b    53            *ファイル情報格納バッファ
  1234. nambuf:
  1235.     .ds.b    92            *ファイル名展開用バッファ
  1236. arg1:
  1237.     .ds.b    256            *入力ファイル名バッファ
  1238. arg2:
  1239.     .ds.b    256            *出力ファイル名バッファ
  1240. cpathbuf
  1241.     .ds.b    65            *カレントパス名バッファ
  1242. spathbuf
  1243.     .ds.b    65            *セーブ先パス名バッファ
  1244.     .even
  1245. file_cnt:
  1246.     .ds.w    1            *ファイル数のカウント用バッファ
  1247. buff_addr:
  1248.     .ds.l    1            *画像読み込みバッファアドレス
  1249. buff_size:
  1250.     .ds.l    1            *画像読み込みバッファサイズ
  1251. filesize:
  1252.     .ds.l    1
  1253. bmpsize:
  1254.     .ds.l    1
  1255. edaban:
  1256.     .ds.w    1
  1257. nameichi:
  1258.     .ds.l    1
  1259. edaichi:
  1260.     .ds.l    1
  1261. dec_buf:
  1262.     .ds.b    10*2
  1263.     .even
  1264.  
  1265.     .end    start
  1266.